iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

來嘗試在 NX 中建立 Vue 元件庫 lib。

跟 Nuxt 一樣,目前官方沒有支援 Vue 的擴充,所以要手動設定。

首先建立一個基於 Vite 的 js lib。

pnpm exec nx generate @nx/js:library

設定 lib 名稱跟建置工具等。

>  NX  Generating @nx/js:library

✔ What name would you like to use for the library? · ui/vue-components
✔ Which unit test runner would you like to use? · vitest
✔ Which bundler would you like to use to build the library? Choose 'none' to skip build setup. · vite

? What should be the project name and where should it be generated?
❯ Derived:
    Name: ui-vue-components
    Root: libs/ui/vue-components

加入 Vue 相關的 package。

pnpm add -D vue vue-tsc @vitejs/plugin-vue @vitejs/plugin-vue-jsx

修改 vite.config.ts ,加入 Vue 插件。

import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';

export default defineConfig({
  plugins: [
    vue(),
    vueJsx(),
		//...
  ],

	//...
});

修改 Typescript 設定。

// tsconfig.json
{
  "extends": "../../../tsconfig.base.json",
  "compilerOptions": {
    "module": "commonjs",
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "types": ["vitest", "vite/client", "vue/ref-macros"],
    "jsx": "react"
  },
  "files": [],
  "include": [],
  "references": [
    {
      "path": "./tsconfig.lib.json"
    },
    {
      "path": "./tsconfig.spec.json"
    }
  ]
}
// tsconfig.lib.json
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../../dist/out-tsc",
    "declaration": true,
    "types": ["node"]
  },
  "exclude": [
    "src/**/*.spec.ts",
    "src/**/*.test.ts",
    "src/**/*.spec.tsx",
    "src/**/*.test.tsx",
    "src/**/*.spec.js",
    "src/**/*.test.js",
    "src/**/*.spec.jsx",
    "src/**/*.test.jsx"
  ],
  "include": [
    "src/**/*.ts",
    "src/**/*.d.ts",
    "src/**/*.tsx",
    "**/*.vue",
    "env.d.ts",
    "vite.config.ts"
  ]
}

在 src 目錄下增加一個 Vue 元件類型的型別宣告。

// src/vue-shim.d.ts
/// <reference types="vite/client" />

declare module '*.vue' {
  import type { DefineComponent } from 'vue';
  const component: DefineComponent<
    NonNullable<unknown>,
    NonNullable<unknown>,
    Nullable<unknown>
  >;
  export default component;
}

設定好後就能來建立元件了。

<!-- src/lib/Button.vue -->
<template>
  <button>
    <slot></slot>
  </button>
</template>
// src/index.ts
export { default as Button } from './lib/Button.vue';

跟 React 那時一樣,經由根目錄的 tsconfig.base.json 提供的路徑引入元件。

import { Button } from '@ironman-nextjs/ui/vue-components'

不過之前提過的 NX 不會自動偵測 Vue 的關聯,所以要經由設定 tag 來手動建立關聯。

// project.json
{
	//...
	"tags": ["scope:ironman-nuxt"]
}

這樣才能在執行 target 的時候自動執行元件庫的建置後再進行專案的建置。


上一篇
在 NX 中建立 Nuxt 專案
下一篇
NX 自定義 plugin 建立客製化的 generator
系列文
組裝前端開發工具箱,從 NX 入手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言